#![allow(dead_code)]
#![allow(unused_variables)]
// 并发和并行都是对“多任务”处理的描述，其中并发是轮流处理，而并行是同时处理。
// 单核心并发、多核心并行、多核心并发。
/*

不同语言对于线程的实现可能大相径庭

由于操作系统提供了创建线程的 API，因此部分语言会直接调用该 API 来创建线程，
    因此最终程序内的线程数和该程序占用的操作系统线程数相等，一般称之为1:1 线程模型，例如 Rust。
还有些语言在内部实现了自己的线程模型（绿色线程、协程），程序内部的 M 个线程最后会以某种映射方式使用 N 个操作系统线程去运行，
    因此称之为M:N 线程模型，其中 M 和 N 并没有特定的彼此限制关系。一个典型的代表就是 Go 语言。
还有些语言使用了 Actor 模型，基于消息传递进行并发，例如 Erlang 语言。


运行时是 那些会被打包到所有程序可执行文件中的 Rust 代码，根据每个语言的设计权衡，
    运行时虽然有大有小（例如 Go 语言由于实现了协程和 GC，运行时相对就会更大一些），但是除了汇编之外，每个语言都拥有它。
    小运行时的其中一个好处在于最终编译出的可执行文件会相对较小，同时也让该语言更容易被其它语言引入使用。

而绿色线程/协程的实现会显著增大运行时的大小，因此 Rust 只在标准库中提供了 1:1 的线程模型，
如果你愿意牺牲一些性能来换取更精确的线程控制以及更小的线程上下文切换成本
，那么可以选择 Rust 中的 M:N 模型，这些模型由三方库提供了实现，例如大名鼎鼎的 tokio。
*/
/*

多线程编程的风险
由于多线程的代码是同时运行的，因此我们无法保证线程间的执行顺序，这会导致一些问题：
    竞态条件(race conditions)，多个线程以非一致性的顺序同时访问数据资源
    死锁(deadlocks)，两个线程都想使用某个资源，但是又都在等待对方释放资源后才能使用，结果最终都无法继续执行
    一些因为多线程导致的很隐晦的 BUG，难以复现和解决
*/
mod atomic;
mod concept;
mod message;
mod rwlock;
mod semaphore;
mod send;
mod thread;
